home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 4
/
United Public Domain Gold 4.iso
/
fredfish
/
ff.0400.dms
/
ff.0400.adf
/
SetCPU
/
SetCPU.h
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-03
|
10KB
|
370 lines
/*
SetCPU V1.60
by Dave Haynie, April 13, 1990
Released to the Public Domain
HEADER FILE
*/
#define PROGRAM_VERSION 160
#include <exec/types.h>
#include <exec/execbase.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <exec/io.h>
#include <devices/trackdisk.h>
#include <libraries/expansionbase.h>
#include <libraries/configregs.h>
#include <libraries/configvars.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/dosextens.h>
#include <libraries/filehandler.h>
#include <functions.h>
#include <stdio.h>
#include <ctype.h>
/* ====================================================================== */
/* Define all bit components used for manipulation of the Cache Control
Register. */
#define CACR_INST ((ULONG)(1L<<0))
#define CACR_DATA ((ULONG)(1L<<8))
#define CACR_FIXED ((ULONG)(CACR_DATA<<CACR_WALLOC))
#define CACR_WALLOC 5
#define CACR_BURST 4
#define CACR_CLEAR 3
#define CACR_ENTRY 2
#define CACR_FREEZE 1
#define CACR_ENABLE 0
#define CACR_ENABLE40 15
#define CACR_DATA40 16
/* ====================================================================== */
/* Define important bits used in various MMU registers. */
/* Here are the CRP definitions. The CRP register is 64 bits long, but
only the first 32 bits are control bits, the next 32 bits provide the
base address of the table. */
#define CRP_UPPER (1L<<31) /* Upper/lower limit mode */
#define CRP_LIMIT(x) ((ULONG)((x)&0x7fff)<<16)/* Upper/lower limit value */
#define CRP_SG (1L<<9) /* Indicates shared space */
#define CRP_DT_INVALID 0x00 /* Invalid root descriptor */
#define CRP_DT_PAGE 0x01 /* Fixed offset, auto-genned */
#define CRP_DT_V4BYTE 0x02 /* Short root descriptor */
#define CRP_DT_V8BYTE 0x03 /* Long root descriptor */
/* Here are the TC definitions. The TC register is 32 bits long. */
#define TC_ENB (1L<<31) /* Enable the MMU */
#define TC_SRE (1L<<25) /* For separate Supervisor */
#define TC_FCL (1L<<24) /* Use function codes? */
#define TC_PS(x) ((ULONG)((x)&0x0f)<<20) /* Page size */
#define TC_IS(x) ((ULONG)((x)&0x0f)<<16) /* Logical shift */
#define TC_TIA(x) ((ULONG)((x)&0x0f)<<12) /* Table indices */
#define TC_TIB(x) ((ULONG)((x)&0x0f)<<8)
#define TC_TIC(x) ((ULONG)((x)&0x0f)<<4)
#define TC_TID(x) ((ULONG)((x)&0x0f)<<0)
/* Here are the page descriptor definitions, for short desctriptors only,
since that's all I'm using at this point. */
#define PD_ADDR(x) ((ULONG)(x)&~0x0fL) /* Translated Address */
#define IV_ADDR(x) ((ULONG)(x)&~0x03L) /* Invalid unused field */
#define PD_WP (1L<<2) /* Write protect it! */
#define PD_CI (1L<<6) /* Cache inhibit */
#define PD_DT_TYPE 0x03 /* Page descriptor type */
#define PD_DT_INVALID 0x00 /* Invalid root descriptor */
#define PD_DT_PAGE 0x01 /* Fixed offset, auto-genned */
#define PD_DT_V4BYTE 0x02 /* Short root descriptor */
#define PD_DT_V8BYTE 0x03 /* Long root descriptor */
/* This is needed for identification of bogus systems that test positive
for MMUs. */
#define BOGUSMMU 0xffffffffL
/* Here's the MMU support stuff. */
#define ROMROUND 0x00020000L /* ROM/Main level at 128K grain */
#define SMALLROMSIZE 0x00040000L
#define BIGROMSIZE 0x00080000L
#define DEVROUND 0x00004000L /* Device level at 16K grain */
#define STKROUND 0x00000400L /* Stack level at 1K grain */
#define TABROUND 0x00000400L /* Table alignment matches page size */
#define PAGESIZE 0x00020000L
#define MAINTABSIZE (128L * sizeof(ULONG))
#define SUBTABSIZE (8L * sizeof(ULONG))
#define STKTABSIZE (16L * sizeof(ULONG))
/* Magic ROM numbers */
#define MAGIC_256 0x11114ef9
#define MAGIC_512 0x11144ef9
/* ====================================================================== */
/* Some external system declarations. */
extern BPTR Lock(), Open();
/* Checking logic */
#define CK68000 0
#define CK68010 1
#define CK68020 2
#define CK68030 3
#define CK68040 4
#define CK68851 5
#define CK68881 6
#define CK68882 7
#define CKFPU 8
#define CKMMU 9
#define CKMMUON 10
#define CKMMUROM 11
#define CKMMUALIEN 12
#define CHECKS 13
#define WARNING 5
#define READOK 0L
#define SizeOf(x) ((ULONG)sizeof(x))
#define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a>b)?a:b)
/* ====================================================================== */
/* From the CONTROL.A module */
extern void SetCACR(),
GetCRP(),
SetCRP(),
SetTC();
extern ULONG GetCACR(),
*GetVBR(),
GetTC();
/* ====================================================================== */
/* From the IDENTS.A module */
extern ULONG GetCPUType(),
GetMMUType(),
GetFPUType();
/* ====================================================================== */
/* From the OTHER.A module */
extern void SetMMUTag(),
FlushATC(),
SetKeyDelay();
extern ULONG KeyCode,
KeyCodeSize,
BerrCode,
BerrCodeSize;
/* ====================================================================== */
/* From the REBOOT.A module. */
extern void ROMBoot(),
CleanBoot();
extern ULONG BootCode,
BootCodeSize,
ResetCode,
ResetCodeSize;
/* ====================================================================== */
/* From the EXPDEV.C module. */
/* This structure is device information used by the memory mapping routine. */
struct ExpROMData {
struct ExpROMData *next;
ULONG ROMbase;
ULONG ROMsize;
ULONG imagebase;
ULONG tablebase;
char *name;
};
extern LONG ReadExpDevs();
extern struct ExpROMData *GetExpROM();
extern void FreeExpROM(),
SafeConfigDevs();
/* ====================================================================== */
/* From the MISC.C module. */
/* Patch types */
#define PT_STRING 1
#define PT_JSR 2
#define PT_END 3
#define PT_IGNORE 4
#define PT_KEYBOARD 5
/* This is a item */
struct pitem {
UWORD Type; /* The type of patch to apply */
UWORD Pad; /* Nothing here yet... */
ULONG Offset; /* The offset at which to apply the patch */
ULONG Length; /* The length of the patch item */
UWORD *Code; /* The actual patch item */
};
/* This is the patch structure. */
struct patch {
struct patch *next; /* Next patchlist */
struct pitem *list; /* First item in this patchlist */
UWORD Version; /* Which ROM version */
UWORD Revision; /* and revision */
};
/* These are the some patch system variables. */
#define KEYPATCH 0
extern struct patch SystemPatch[];
extern struct MemChunk *lastpatch;
/* The actual functions. */
extern LONG striequ(),
strniequ();
extern void MotorOff();
extern BYTE ReadBuf();
extern LONG CheckTDDev();
extern LONG AddPatch();
/* ====================================================================== */
/* From the MMU.C module. */
extern void Phantom(),
SetMMURegs(),
FillBasicTable(),
FreeMMUTable(),
MakeExpTable(),
MakeFastStack(),
FreeFastStack();
/* ====================================================================== */
/* From the MEMORY.C module. */
/* This section describes the system tag structure, where I stick all the
information that I like to keep around. */
#define ROM_NOP 0x0000 /* No ROM operation called for */
#define ROM_FAST 0x0002 /* Normally installed FASTROM image */
#define ROM_KICK 0x0003 /* Installed as a KICK image */
#define ROM_FKICK 0x0004 /* A KICK image made into a FAST image */
/* This was originally the patchtag structure, which looked like a patch. I
decided that was real kludgy. I hook the systag onto an invalid page
descriptor which I locate in the physical ROM image, a place that should
always be safe to have an invalid tag structure. Don't change this without
checking in the "030Stuff.a" file -- some of these structure members are
used by the reboot code. */
struct systag {
ULONG tagsize; /* Size of this tag */
ULONG progver; /* The program version */
ULONG *maintable; /* The main ROM table */
ULONG *romhi; /* The main ROM image */
UWORD romtype; /* Type of MMU ROM */
UWORD patches; /* The number of other patches applied */
struct MemChunk *patchlist; /* List of installed patches */
struct ExpROMData *devs; /* Translated device ROMs */
ULONG TC; /* Precomputed TC used for KICK. */
ULONG CRP[2]; /* Precomputed CRP used for KICK. */
UWORD config; /* Configuration status. */
ULONG BerrSize; /* Size of bus error handler. */
char *OldBerr; /* The old BERR routine. */
char *BerrHandler; /* My BERR routine. */
short wrapup; /* Upper address wrap bound. */
short wrapdown; /* Lower address wrap bound. */
ULONG tablesize; /* Main table size. */
char *ResetCode; /* Actual reset routine */
ULONG romsize; /* Size of ROM image */
ULONG romloc; /* Where does the fool thing go? */
ULONG romstart; /* And where do we start it up? */
ULONG *romlo; /* Secondary ROM image, if needed */
char *sysstack; /* Physical system stack image */
ULONG sysstksize; /* System Stack allocated size. */
ULONG ResetSize; /* Size of the reset code. */
char *OldReset; /* Old Reset Code */
};
/* The actual functions */
extern void MemCopy(),
SetMMURegs(),
*AllocAligned(),
SnoopSpecial(),
FillBasicTable(),
FreeSAFEImage();
ULONG * SizeROM();
extern struct systag *AllocROMImage(),
*AllocDISKImage(),
*AllocSAFEImage(),
*GetSysTag();
extern LONG SmartlyGetRange();
/* ====================================================================== */
/* From the DISKIO.C module. */
extern struct systag *AllocKSImage(),
*AllocFILEImage(),
*AllocDISKImage();
/* ====================================================================== */
/* From the COOLHAND.C module. */
struct Window *CoolHand();
/* ====================================================================== */
/* Intermodule globals */
struct CfgBlock {
ULONG Addr, Size;
};
#ifdef MAIN_MODULE
struct ExpansionBase *ExpansionBase = NULL; /* The expansion library */
unsigned short LoadErr = 16;
struct CfgBlock Bridge = { 0L, 0L }, A26x0 = { 0L, 0L };
#else
extern struct ExpansionBase *ExpansionBase;
extern unsigned short LoadErr, forcewrap;
extern struct CfgBlock Bridge, A26x0;
extern BOOL allochead,aliens;
extern ULONG cpu;
#endif